<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>WebGL Shader Conformance Tests</title>
<link rel="stylesheet" href="../../../../resources/js-test-style.css"/>
<script src="../../../../resources/js-test-pre.js"></script>
<script src="../../../../resources/webgl-test.js"></script>
<script src="../../../../resources/webgl-test-utils.js"></script>
<script src="shader-utils.js"></script>
<script src="shader-library.js"></script>
<script src="shader-library-case.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<script>
	
	description("Testing the .test parser components.");
	
	var wtu                = WebGLTestUtils;
	var successfullyParsed = false;
	var parser             = new shaderLibrary.Parser();
	
	
	// this array of functions is processed sequentially.
	// returning false will abort
	var tests = [
		
		
		function() {
			var result = shaderLibrary.isWhitespace(" ");
			test_result(
				"Checking isWhitespace. Passing \" \". Expecting true",
				result === true, result
			);
			return true;
		},
		function() {
			var result = shaderLibrary.isWhitespace("q");
			test_result(
				"Checking isWhitespace. Passing \"q\". Expecting false",
				result === false, result
			);
			return true;
		},
		function() {
			var result = shaderLibrary.isWhitespace(" \r\n\t");
			test_result(
				"Checking isWhitespace. Passing \" \\r\\n\\t\". Expecting true",
				result === true, result
			);
			return true;
		},
		function() {
			var result = shaderLibrary.isWhitespace(" \r\n\tq");
			test_result(
				"Checking isWhitespace. Passing \" \\r\\n\\tq\". Expecting false",
				result === false, result
			);
			return true;
		},
		
		function() {
			try {
				var result = shaderLibrary.removeExtraIndentation(
					"\t\t\taaaa\n\t    \t\tbbbb\n\t\t\tcccc\r\n\t\t\tdddd"
				);
			} catch (err) {
				result = "aborted";
			}
			
			test_result(
				"Checking removeExtraIndentation. \
				Passing \"\t\t\taaaa\n\t    \t\tbbbb\n\t\t\tcccc\r\n\t\t\tdddd\". \
				Expecting \"aaaa\n\tbbbb\ncccc\ndddd\"",
				result === "aaaa\n\tbbbb\ncccc\ndddd",
				result
			);
			return true;
		},
		
		
		function() {
			// looking for private access to the parser object
			var result = (typeof parser.priv != 'undefined');
			test_result("looking for private member access", result, result);
			return result;
		},
		
		function() {
			try {
				var result = parser.priv.parseIntLiteral("42");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking int parser. Passing \"42\". Expecting 42",
				result === 42, result
			);
			return true;
		},
		function() {
			try {
				var result = parser.priv.parseIntLiteral("-5");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking int parser. Passing \"-5\". Expecting -5",
				result === -5, result
			);
			return true;
		},
		function() {
			try {
				var result = parser.priv.parseIntLiteral("42.9");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking int parser. Passing \"42.9\". Expecting 42",
				result === 42, result
			);
			return true;
		},
		function() {
			try {
				var result = parser.priv.parseFloatLiteral("42.9");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking float parser. Passing \"42.9\". Expecting 42.9",
				result === 42.9, result
			);
			return true;
		},
		
		
		function() {
			try {
				var result = parser.priv.parseStringLiteral("\"hello world\"");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking string parser. Passing \"\"hello world\"\". Expecting \"hello world\"",
				result == "hello world", result
			);
			return true;
		},
		function() {
			try {
				var result = parser.priv.parseStringLiteral("\"hello world\"extra");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking string parser. Passing \"\"hello world\"extra\". Expecting \"hello world\"",
				result == "hello world", result
			);
			return true;
		},
		function() {
			try {
				var result = parser.priv.parseStringLiteral("\"\\\"\\\"\\\"\"\\\"\"");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking string parser. Passing \"\"\\\"\\\"\\\"\"\\\"\"\". Expecting \"\"\"\"\"",
				result == "\"\"\"", result
			);
			return true;
		},
		function() {
			try {
				var result = parser.priv.parseStringLiteral("\"newline test\\nnewline test\"");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking string parser. Passing \"\"newline test\\nnewline test\"\". Expecting \"newline test\nnewline test\"",
				result == "newline test\nnewline test", result
			);
			return true;
		},
		function() {
			try {
				var result = parser.priv.parseStringLiteral("\"tab test\\ttab test\"");
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking string parser. Passing \"\"tab test\\ttab test\"\". Expecting \"tab test\ttab test\"",
				result == "tab test\ttab test", result
			);
			return true;
		},
		
		function() {
			try {
				var result = parser.priv.parseShaderSource(
					"\"\"\t\t\taaaa\n\t    \t\tbbbb\n\t\t\tcccc\r\n\t\t\tdddd\"\""
				);
			} catch (err) {
				result = "aborted";
			}
			
			test_result(
				"Checking parseShaderSource. \
				Passing \"\"\"\t\t\taaaa\n\t    \t\tbbbb\n\t\t\tcccc\r\n\t\t\tdddd\"\"\". \
				Expecting \"aaaa\n\tbbbb\ncccc\ndddd\"",
				result === "aaaa\n\tbbbb\ncccc\ndddd",
				result
			);
			return true;
		},
		
		function() {
			try {
				var result = parser.priv.advanceTokenTester("bool value = true;", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"bool value = true;\", 0",
				result.idType == parser.priv.Token.TOKEN_BOOL && result.value == "bool",
				result.name + ": " + result.value
			);
		},
		
		function() {
			try {
				var result = parser.priv.advanceTokenTester("bool value = true;", 4);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"bool value = true;\", 4",
				result.idType == parser.priv.Token.TOKEN_IDENTIFIER && result.value == "value",
				result.name + ": " + result.value
			);
		},
		//*
		function() {
			try {
				var result = parser.priv.advanceTokenTester("bool value = true;", 11);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"bool value = true;\", 11",
				result.idType == parser.priv.Token.TOKEN_ASSIGN,
				result.name + ": " + result.value
			);
		},
		//*/
		function() {
			try {
				var result = parser.priv.advanceTokenTester("bool value = true;", 12);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"bool value = true;\", 12",
				result.idType == parser.priv.Token.TOKEN_TRUE && result.value == "true",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("bool value = true;", 17);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"bool value = true;\", 17",
				result.idType == parser.priv.Token.TOKEN_SEMI_COLON && result.value == ";",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("-7", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"-7\", 0",
				result.idType == parser.priv.Token.TOKEN_MINUS && result.value == "-",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("-7", 1);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"-7\", 1",
				result.idType == parser.priv.Token.TOKEN_INT_LITERAL && result.value == "7",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("3.145", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"3.145\", 0",
				result.idType == parser.priv.Token.TOKEN_FLOAT_LITERAL && result.value == "3.145",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("1.0e+10", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"1.0e+10\", 0",
				result.idType == parser.priv.Token.TOKEN_FLOAT_LITERAL && result.value == "1.0e+10",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("1.0e", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"1.0e\", 0",
				result === "aborted",
				result
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("\"\"shader source\"\";", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"\"\"shader source\"\";\", 0",
				result.idType == parser.priv.Token.TOKEN_SHADER_SOURCE && result.value == "\"\"shader source\"\"",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("\"string\";", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"\"string\";\", 0",
				result.idType == parser.priv.Token.TOKEN_STRING && result.value == "\"string\"",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("\'string\';", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"\'string\';\", 0",
				result.idType == parser.priv.Token.TOKEN_STRING && result.value == "\'string\'",
				result.name + ": " + result.value
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("\'string\";", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"\'string\";\", 0",
				result === "aborted",
				result
			);
		},
		function() {
			try {
				var result = parser.priv.advanceTokenTester("\'string\\", 0);
			} catch (err) {
				result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing \"\'string\\\", 0",
				result === "aborted",
				result
			);
		},
		function() {
			try {
				var result = parser.priv.mapDataTypeToken(parser.priv.Token.TOKEN_INT);
			} catch (err) {
				var result = "aborted";
			}
			test_result(
				"Checking advanceToken. Passing parser.priv.Token.TOKEN_INT",
				result === shaderUtils.DataType.TYPE_INT,
				result
			);
		},
		
		function() {
			successfullyParsed = true;
			return true;
		},
		
	];
	
	var current = 0;
	
	function test_result(description, result, additional) {
		switch (typeof(additional)) {
		 case "undefined":
			break;
		 case "string":
		 	description += ": \"" + additional + "\"";
		 	break;
		 default:
			description += ": " + additional;
			break;
		}
		if (result) {
			testPassed(description);
		} else {
			testFailed(description);
		}
	}
	
	function do_next() {
		if (tests[current]() !== false && tests.length > ++current) {
			setTimeout(do_next, 0);
		} else {
			on_complete();
		}
	}
	
	function on_complete() {
		var testPost = document.createElement('script');
		testPost.src = "../../../../resources/js-test-post.js";
		document.body.appendChild(testPost);
	}
	
	do_next();
	
//	
</script>
</body>
</html>
